Skip to content

Conversation

@rkeerthient
Copy link
Contributor

Tickets - OPAQF-41, OPAQF-53. Closed previous PR.

  • Added new prop for TranslatableCTA - openInNewTab.
  • Added openInNewTab option for links in the Expanded Header and Expanded Footer.
  • Added a prop to center-align the Secondary Footer section.
  • Added relevant test cases.
  • Used inline instead of flex for the external-link indicator to prevent forced center alignment on mobile.
  • Did fixes on older PR.

Ran test on older header by mistake, please ignore.

Screen.Recording.2026-01-02.at.1.58.52.PM.mov

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 2, 2026

Walkthrough

This PR adds support for opening links in new tabs across footer and header components, alongside link positioning refinements. It introduces the openInNewTab boolean property to multiple link/CTA components with corresponding i18n translations across 20+ language locales. The link alignment property is renamed from linksAlignment to linksPosition throughout the footer components, with expanded alignment options (left, center, right). A data migration script ensures backward compatibility for existing components using the old property name. The changes include UI schema updates, component rendering logic, default values, test coverage, and comprehensive translation key additions.

Possibly related PRs

Suggested labels

create-dev-release

Suggested reviewers

  • benlife5
  • asanehisa
  • mkilpatrick
  • briantstephan

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main changes: adding open-in-new-tab functionality and center-alignment for the secondary footer.
Description check ✅ Passed The description clearly relates to the changeset, explaining the new openInNewTab prop, footer center-alignment feature, test cases, and styling decisions.
✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 415d4f0 and da2bc62.

⛔ Files ignored due to path filters (69)
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 51 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 51 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 51 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 51 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 51 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 51 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 10 props - secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 11 props - secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 15 props - fixed header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 15 props - sticky header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 20 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 41 props - no secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 41 props - with secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 49 props - no logo.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 51 props - with external links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] default props (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 10 props (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 10 props - secondary header (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 11 props - secondary header (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 15 props - fixed header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 15 props - sticky header (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 20 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 51 props - with external links (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 51 props - with external links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 10 props - secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 11 props - secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 15 props - fixed header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 15 props - sticky header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 20 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 41 props - no secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 41 props - with secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 49 props - no logo.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 51 props - with external links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/NearbyLocationsSection/[mobile] default props with multiple nearby locations.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/NearbyLocationsSection/[mobile] version 10 with multiple nearby locations.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/NearbyLocationsSection/[mobile] version 36 with multiple nearby locations.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/PromoSection/[mobile] default props with document data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/PromoSection/[mobile] default props with empty document.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/PromoSection/[tablet] default props with document data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/PromoSection/[tablet] default props with empty document.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
📒 Files selected for processing (4)
  • packages/visual-editor/src/components/footer/ExpandedFooter.test.tsx
  • packages/visual-editor/src/components/header/ExpandedHeader.test.tsx
  • packages/visual-editor/src/components/migrations/0051_update_link_align_prop.ts
  • packages/visual-editor/src/components/migrations/migrationRegistry.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/visual-editor/src/components/footer/ExpandedFooter.test.tsx
  • packages/visual-editor/src/components/migrations/migrationRegistry.ts
  • packages/visual-editor/src/components/header/ExpandedHeader.test.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: call_unit_test / unit_tests (22.x)
  • GitHub Check: call_unit_test / unit_tests (24.x)
  • GitHub Check: call_unit_test / unit_tests (20.x)
  • GitHub Check: semgrep/ci
🔇 Additional comments (2)
packages/visual-editor/src/components/migrations/0051_update_link_align_prop.ts (2)

4-26: LGTM!

The migration logic is correct and idempotent. The default value of "right" for ExpandedFooter is appropriate and matches the existing default in the codebase, while the "left" default for SecondaryFooterSlot aligns with its default configuration.


28-45: LGTM! The migration defaults match the original component behavior.

The migration logic for both ExpandedFooter and SecondaryFooterSlot is correct. The different default alignment values are intentional: ExpandedFooter's primary footer defaults to "right" (line 445 of ExpandedFooter.tsx), while SecondaryFooterSlot defaults to "left" (line 183 of SecondaryFooterSlot.tsx). The migration preserves these original defaults through the fallback chain.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (5)
packages/visual-editor/locales/zh/visual-editor.json (1)

300-300: Consider using consistent terminology for browser tabs.

The translation uses "选项卡" (option card/tab), while Line 33 uses "标签页" (tab page) for the same concept of browser tabs. In standard Chinese localization, "标签页" is more commonly used for browser tabs and would provide better consistency within this locale file.

🔎 Suggested fix for terminology consistency
-    "openInNewTab": "在新选项卡中打开",
+    "openInNewTab": "在新标签页中打开",
packages/visual-editor/locales/nb/visual-editor.json (1)

279-279: New field translation added successfully.

The linksPosition field has been added to support the property rename from linksAlignment. Note that both keys now coexist in the file (line 278: linksAlignment, line 279: linksPosition), which appears intentional for backward compatibility during the migration phase.

Optional: Consider using consistent terminology for "links" — line 278 uses "Koblinger" while line 279 uses "Linker". While both are valid Norwegian words, using the same term throughout might improve consistency. However, this may be following an established style guide.

packages/visual-editor/src/components/footer/CopyrightMessageSlot.tsx (1)

34-46: Consider simplifying the alignment logic.

The switch statement with array initialization and push operations works correctly but could be more concise.

🔎 Proposed refactor using conditional logic
- let alignmentStyle = ["text-center"];
- switch (alignment) {
-   case "left": {
-     alignmentStyle.push("md:text-left");
-     break;
-   }
-   case "right": {
-     alignmentStyle.push("md:text-right");
-     break;
-   }
-   default:
-     break;
- }
+ const alignmentStyle = [
+   "text-center",
+   ...(alignment === "left" ? ["md:text-left"] :
+       alignment === "right" ? ["md:text-right"] : [])
+ ];

Or using template literals directly:

- let alignmentStyle = ["text-center"];
- switch (alignment) {
-   case "left": {
-     alignmentStyle.push("md:text-left");
-     break;
-   }
-   case "right": {
-     alignmentStyle.push("md:text-right");
-     break;
-   }
-   default:
-     break;
- }
-
  return resolvedText ? (
-   <Body variant="xs" className={alignmentStyle.join(" ")}>
+   <Body variant="xs" className={`text-center ${alignment === "left" ? "md:text-left" : alignment === "right" ? "md:text-right" : ""}`}>
      {resolvedText}
    </Body>
packages/visual-editor/src/components/footer/FooterLinksSlot.tsx (1)

139-148: Add a default value for the openInNewTab field.

The field definition for openInNewTab lacks a default value. While defaultLink (imported from ExpandedFooter.tsx) sets openInNewTab: false, explicitly specifying a default in the field definition ensures consistency and prevents undefined values if the field is added independently.

🔎 Proposed fix
 openInNewTab: YextField(
   msg("fields.openInNewTab", "Open in new tab"),
   {
     type: "radio",
     options: [
       { label: msg("fields.options.yes", "Yes"), value: true },
       { label: msg("fields.options.no", "No"), value: false },
     ],
+    defaultValue: false,
   }
 ),
packages/visual-editor/src/components/footer/ExpandedFooter.tsx (1)

60-60: Consider adding "center" alignment option for consistency.

ExpandedFooterStyles.primaryFooter.linksPosition only supports "left" | "right", while SecondaryFooterSlot.styles.linksPosition (Line 47 in SecondaryFooterSlot.tsx) supports "left" | "center" | "right". This inconsistency means users can center-align secondary footer links but not primary footer links, which may be unexpected.

If center alignment is intentionally excluded from the primary footer due to design constraints, this is fine. Otherwise, consider adding center alignment support for consistency.

📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2c4682d and 4a72d32.

⛔ Files ignored due to path filters (70)
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 10 props - no data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 42 props - no data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 10 props - no data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 42 props - no data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 10 props - no data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 42 props - no data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 10 props - secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 11 props - secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 15 props - fixed header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 15 props - sticky header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 20 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 41 props - no secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 41 props - with secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 50 props - with external links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] default props (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 10 props (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 10 props - secondary header (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 11 props - secondary header (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 15 props - fixed header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 15 props - sticky header (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 20 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 50 props - with external links (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 50 props - with external links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 10 props - secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 11 props - secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 15 props - fixed header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 15 props - sticky header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 20 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 41 props - no secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 41 props - with secondary header.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 50 props - with external links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/Header/[desktop] default props with document data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/Header/[desktop] version 2 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/Header/[mobile] default props with document data (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/Header/[mobile] version 2 props (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
📒 Files selected for processing (40)
  • packages/visual-editor/locales/cs/visual-editor.json
  • packages/visual-editor/locales/da/visual-editor.json
  • packages/visual-editor/locales/de/visual-editor.json
  • packages/visual-editor/locales/en-GB/visual-editor.json
  • packages/visual-editor/locales/en/visual-editor.json
  • packages/visual-editor/locales/es/visual-editor.json
  • packages/visual-editor/locales/et/visual-editor.json
  • packages/visual-editor/locales/fi/visual-editor.json
  • packages/visual-editor/locales/fr/visual-editor.json
  • packages/visual-editor/locales/hr/visual-editor.json
  • packages/visual-editor/locales/hu/visual-editor.json
  • packages/visual-editor/locales/it/visual-editor.json
  • packages/visual-editor/locales/ja/visual-editor.json
  • packages/visual-editor/locales/lt/visual-editor.json
  • packages/visual-editor/locales/lv/visual-editor.json
  • packages/visual-editor/locales/nb/visual-editor.json
  • packages/visual-editor/locales/nl/visual-editor.json
  • packages/visual-editor/locales/pl/visual-editor.json
  • packages/visual-editor/locales/pt/visual-editor.json
  • packages/visual-editor/locales/ro/visual-editor.json
  • packages/visual-editor/locales/sk/visual-editor.json
  • packages/visual-editor/locales/sv/visual-editor.json
  • packages/visual-editor/locales/tr/visual-editor.json
  • packages/visual-editor/locales/zh-TW/visual-editor.json
  • packages/visual-editor/locales/zh/visual-editor.json
  • packages/visual-editor/src/components/atoms/cta.tsx
  • packages/visual-editor/src/components/footer/CopyrightMessageSlot.tsx
  • packages/visual-editor/src/components/footer/ExpandedFooter.test.tsx
  • packages/visual-editor/src/components/footer/ExpandedFooter.tsx
  • packages/visual-editor/src/components/footer/FooterExpandedLinkSectionSlot.tsx
  • packages/visual-editor/src/components/footer/FooterExpandedLinksWrapper.tsx
  • packages/visual-editor/src/components/footer/FooterLinksSlot.tsx
  • packages/visual-editor/src/components/footer/SecondaryFooterSlot.tsx
  • packages/visual-editor/src/components/header/ExpandedHeader.test.tsx
  • packages/visual-editor/src/components/header/HeaderLinks.tsx
  • packages/visual-editor/src/components/migrations/0050_update_link_align_prop.ts
  • packages/visual-editor/src/components/migrations/migrationRegistry.ts
  • packages/visual-editor/src/docs/ai/components.d.ts
  • packages/visual-editor/src/docs/components.md
  • packages/visual-editor/src/types/types.ts
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-12-12T20:17:37.033Z
Learnt from: benlife5
Repo: yext/visual-editor PR: 946
File: packages/visual-editor/src/components/migrations/migrationRegistry.ts:47-48
Timestamp: 2025-12-12T20:17:37.033Z
Learning: In the yext/visual-editor repository, empty object placeholders (`{}`) in the migrationRegistry array are sometimes intentionally used to reserve migration slots for parallel PRs to prevent merge conflicts and maintain consistent migration indices.

Applied to files:

  • packages/visual-editor/src/components/migrations/0050_update_link_align_prop.ts
  • packages/visual-editor/src/components/migrations/migrationRegistry.ts
📚 Learning: 2025-12-23T16:36:42.670Z
Learnt from: benlife5
Repo: yext/visual-editor PR: 958
File: packages/visual-editor/locales/ro/visual-editor.json:394-394
Timestamp: 2025-12-23T16:36:42.670Z
Learning: In Romanian locale files (ro), "Top" is an acceptable translation for directional terms like "top_direction" rather than the native Romanian "Sus". The maintainer benlife5 confirmed this is the preferred translation in packages/visual-editor/locales/ro/visual-editor.json.

Applied to files:

  • packages/visual-editor/locales/ro/visual-editor.json
  • packages/visual-editor/locales/it/visual-editor.json
  • packages/visual-editor/locales/fi/visual-editor.json
  • packages/visual-editor/locales/en/visual-editor.json
📚 Learning: 2025-12-15T20:59:25.571Z
Learnt from: benlife5
Repo: yext/visual-editor PR: 943
File: packages/visual-editor/src/components/contentBlocks/image/Image.tsx:175-191
Timestamp: 2025-12-15T20:59:25.571Z
Learning: In the ImageWrapper component at packages/visual-editor/src/components/contentBlocks/image/Image.tsx, when an Image is wrapped in a MaybeLink, the aria-label should be omitted because the image's alt text serves as the accessible name for the link. Adding an aria-label would override the image's alt text.

Applied to files:

  • packages/visual-editor/src/components/atoms/cta.tsx
🧬 Code graph analysis (2)
packages/visual-editor/src/components/migrations/migrationRegistry.ts (1)
packages/visual-editor/src/components/migrations/0050_update_link_align_prop.ts (1)
  • updateLinksAlignmentMigration (3-46)
packages/visual-editor/src/components/footer/ExpandedFooter.tsx (2)
packages/visual-editor/src/editor/YextField.tsx (1)
  • YextField (188-327)
packages/visual-editor/src/editor/index.ts (1)
  • YextField (15-15)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: call_unit_test / unit_tests (20.x)
  • GitHub Check: semgrep/ci
🔇 Additional comments (69)
packages/visual-editor/locales/it/visual-editor.json (3)

32-34: Verify aria object structure is consistent across all locale files.

The new aria object with nested opensInNewTab uses a different structure than existing ariaLabel* keys (which are flat). Confirm this restructuring is intentional and applied uniformly across the 20+ locale files mentioned in the PR summary to avoid inconsistency.


278-279: Clarify the coexistence of linksAlignment and linksPosition.

Both linksAlignment (line 278) and the new linksPosition (line 279) are present in the locale file. The PR summary describes this as a "rename" operation. Confirm whether linksAlignment should be deprecated or if both keys are intentionally retained for backward compatibility during migration.


300-300: Translation quality is solid.

The Italian translation "Apri in una nuova scheda" (Open in a new tab) is correct and well-placed within the fields object. It complements the new aria.opensInNewTab label appropriately.

packages/visual-editor/locales/sk/visual-editor.json (3)

32-34: LGTM! Verify Slovak translation accuracy.

The aria label template structure is correct and follows the expected i18n pattern with the {{label}} variable properly positioned. The implementation will improve accessibility by announcing that links open in a new tab.

Please verify the Slovak translation with a native speaker to ensure "{{label}} (otvorí sa na novej karte)" accurately conveys "(opens in new tab)".


280-280: LGTM! Confirm both keys are intentionally preserved for migration.

The new linksPosition key has been added while linksAlignment (line 279) remains in the file. This is likely intentional to support the migration strategy mentioned in the PR summary.

Please confirm that retaining both linksAlignment and linksPosition is the intended migration strategy, allowing components to gradually transition from the old to the new property name.


301-301: LGTM! Verify Slovak translation accuracy.

The openInNewTab field label has been correctly added and aligns with the PR objective to enable links to open in a new tab.

Please verify with a native Slovak speaker that "Otvoriť na novej karte" accurately translates to "Open in new tab".

packages/visual-editor/locales/et/visual-editor.json (3)

32-34: LGTM! Structure and placement are correct.

The new aria.opensInNewTab key is properly placed at the top level and uses correct placeholder syntax for accessibility labels. The JSON structure is valid.

Since I cannot verify Estonian language accuracy, please confirm the translation with a native speaker or through your localization review process. The translation should convey: "{{label}} (opens in a new tab)".


279-279: LGTM! Field label properly added.

The linksPosition field label is correctly placed within the fields object and follows the established pattern. The coexistence with linksAlignment (Line 278) aligns with the migration strategy described in the PR summary.

Please verify the Estonian translation "Linkide asukoht" accurately conveys "Links position" or "Links location" through your localization review process.


300-300: LGTM! Field label correctly added.

The openInNewTab field label is properly placed within the fields object with valid JSON structure, supporting the new functionality for opening links in new tabs.

Please verify through your localization process that the Estonian translation "Ava uuel vahelehel" correctly means "Open in new tab".

packages/visual-editor/locales/zh/visual-editor.json (2)

32-34: LGTM!

The new aria object with the opensInNewTab translation is correctly structured and uses appropriate Chinese terminology for browser tabs.


279-279: LGTM!

The linksPosition field translation is correct and appropriately placed alongside the existing linksAlignment field.

packages/visual-editor/locales/tr/visual-editor.json (3)

32-34: LGTM! Accessibility enhancement added correctly.

The new aria.opensInNewTab translation key correctly uses interpolation ({{label}}) to create dynamic accessible labels for links that open in new tabs, improving screen reader experience.


279-279: LGTM! New positioning key added.

The linksPosition translation has been added to support the expanded alignment options (left | center | right) mentioned in the PR objectives. Note that linksAlignment (line 278) still exists, which is expected during the migration period for backward compatibility.


300-300: LGTM! Form field label added.

The openInNewTab translation has been added to support the new boolean prop on TranslatableCTA components, allowing users to configure links to open in new tabs.

packages/visual-editor/locales/es/visual-editor.json (3)

32-34: LGTM! Aria label for new tab accessibility.

The Spanish translation "{{label}} (se abre en una nueva pestaña)" correctly implements the accessibility pattern for links opening in new tabs. The template variable interpolation follows the expected i18next format.


278-278: LGTM! New linksPosition translation added.

The translation "Posición de los enlaces" is appropriate. Note that both linksAlignment (line 277) and linksPosition are present, which aligns with the migration strategy mentioned in the PR summary for renaming this property.


299-299: LGTM! Translation for openInNewTab option.

The translation "Abrir en nueva pestaña" is correct and natural Spanish for the new tab functionality being added to CTA components.

packages/visual-editor/locales/ro/visual-editor.json (3)

32-34: LGTM! New accessibility label added correctly.

The new aria.opensInNewTab translation is well-structured and uses appropriate Romanian grammar. The reflexive form "se deschide" correctly describes the automatic action, and the interpolation placeholder is properly positioned.


279-279: LGTM! Field label properly positioned and translated.

The linksPosition translation is placed logically next to the related linksAlignment field (line 278) and follows the consistent noun phrase pattern used for similar UI field labels throughout the file.


300-300: LGTM! Boolean field label follows established patterns.

The openInNewTab translation uses the imperative form "Deschide într-o filă nouă", which is consistent with other boolean action fields in this locale file (e.g., includeHyperlink at line 258). The translation accurately conveys the field's purpose.

packages/visual-editor/locales/hu/visual-editor.json (3)

32-34: LGTM! Accessibility enhancement properly structured.

The new aria.opensInNewTab key follows the correct i18n interpolation pattern and is positioned correctly in the JSON structure.

Optionally verify the Hungarian translation accuracy with a native speaker or translation tool to ensure "új lapon nyílik meg" is the most natural phrasing.


279-279: LGTM! New translation key added for position configuration.

The linksPosition field is correctly placed and structured. Note that both linksAlignment (line 278) and linksPosition coexist, which aligns with the migration strategy mentioned in the PR context.


300-300: LGTM! Translation key for new tab functionality added.

The openInNewTab field is correctly structured and positioned alphabetically within the fields object.

packages/visual-editor/locales/lt/visual-editor.json (3)

32-34: LGTM! Well-structured accessibility label.

The aria.opensInNewTab translation correctly uses interpolation syntax {{label}} for dynamic content, which will properly support the accessibility enhancement for links opening in new tabs.


279-279: LGTM! New translation key added correctly.

The linksPosition field translation is properly placed in the fields section. Note that linksAlignment (line 278) still exists alongside this new key, which is expected during the migration period mentioned in the PR objectives.


300-300: LGTM! Translation key added correctly.

The openInNewTab field translation is properly placed within the fields section and follows the consistent format of other field labels in the file.

packages/visual-editor/locales/nb/visual-editor.json (2)

32-34: LGTM! Accessibility enhancement properly implemented.

The new ARIA label template correctly uses the {{label}} placeholder and provides screen reader users with information that the link opens in a new tab.


300-300: LGTM! Field translation is correct.

The translation "Åpne i ny fane" accurately represents "Open in new tab" in Norwegian and will be used as the label for the new feature.

packages/visual-editor/src/components/footer/CopyrightMessageSlot.tsx (2)

18-18: LGTM! Center alignment option added.

The addition of "center" to the alignment union type aligns with the PR objectives to support center-aligned secondary footer sections.


34-46: Verify mobile-first centering is intentional.

The new alignment logic centers text on mobile screens for all alignment values, with left/right alignment only applying to md: breakpoint and above. This changes the behavior for existing sites:

  • alignment="left": Previously left-aligned on all screens → Now centered on mobile, left on desktop+
  • alignment="right": Previously right-aligned on all screens → Now centered on mobile, right on desktop+

The AI summary states "default alignment behavior remains," but this mobile-first approach represents a behavioral change. Please confirm this is intentional and not a breaking change for existing component instances.

packages/visual-editor/locales/pt/visual-editor.json (2)

32-34: LGTM! Accessibility enhancement added correctly.

The new ARIA label translation properly supports screen reader announcements for links that open in new tabs.


279-279: LGTM! New field translation added.

The translation "Posição dos links" (Position of links) is clear and appropriate for the UI field label.

packages/visual-editor/locales/en-GB/visual-editor.json (3)

32-34: Excellent accessibility enhancement!

The ARIA label follows WCAG best practices by informing assistive technology users that a link will open in a new tab. The interpolation pattern with {{label}} allows for flexible, context-aware announcements.


299-299: LGTM!

The field label is clear, concise, and consistent with the existing naming conventions in the locale file. It appropriately describes the boolean control for opening links in a new tab.


277-278: Verify the migration strategy for the linksAlignment → linksPosition transition.

Both linksAlignment (line 277) and linksPosition (line 278) coexist in this locale file. Confirm that:

  1. The migration properly updates all existing component instances using linksAlignment
  2. A clear deprecation timeline exists for linksAlignment
  3. The old key will be removed from all locale files once migration is complete
packages/visual-editor/locales/nl/visual-editor.json (3)

32-34: LGTM! Good accessibility enhancement.

The new ARIA translation key provides screen reader users with context when links open in new tabs, following accessibility best practices.


300-300: LGTM!

The openInNewTab field translation is correctly added and aligns with the PR's objective to support opening links in new tabs.


279-279: Both linksAlignment and linksPosition should coexist in the locale files.

The presence of both keys is intentional. Migration 0050_update_link_align_prop.ts explicitly maps the legacy linksAlignment property to the new linksPosition property, using it as a fallback: linksPosition: primaryFooter.linksPosition ?? linksAlignment ?? "right". The new linksPosition property is already active in footer components (ExpandedFooter.tsx, SecondaryFooterSlot.tsx), and both keys are consistently maintained across all 26 locale files as part of the migration strategy. No action needed.

packages/visual-editor/locales/ja/visual-editor.json (3)

300-300: Verify Japanese translation for the UI label.

The placement and structure are correct. Please verify that "新しいタブで開く" is the appropriate Japanese translation for "Open in new tab" as a UI field label.


278-279: Both linksAlignment and linksPosition keys should coexist during the migration period.

The migration file (0050_update_link_align_prop.ts) transforms linksAlignment to linksPosition in component data. Since legacy data still contains linksAlignment and the migration reads this property to map it to linksPosition, both locale keys are necessary. Once defaultLayoutData.ts and all test data are updated to use linksPosition, the linksAlignment key can be removed in a follow-up PR.


32-34: Translation is accurate and follows accessibility best practices.

The translation "{{label}} (新しいタブで開きます)" correctly conveys "opens in new tab" in Japanese using the polite form appropriate for user-facing ARIA labels. The parenthetical format matches standard accessibility label patterns and the {{label}} placeholder is used correctly for dynamic content. No changes needed.

packages/visual-editor/locales/zh-TW/visual-editor.json (1)

279-279: Note: AI summary incorrectly describes the location of this key.

The AI summary states this key is under approvals.linksPosition, but the actual code shows it's located under fields.linksPosition (within the fields object starting at line 173).

packages/visual-editor/locales/hr/visual-editor.json (1)

32-34: LGTM! Locale additions are correct.

The new translation keys for ARIA label, links position, and open in new tab feature are properly added and follow the expected structure across the codebase.

Also applies to: 279-279, 300-300

packages/visual-editor/locales/en/visual-editor.json (1)

32-34: LGTM! English locale additions are correct.

The base English translations are clear and consistent with the feature requirements. These serve as the reference for other locale translations.

Also applies to: 278-278, 299-299

packages/visual-editor/locales/fi/visual-editor.json (1)

32-34: LGTM! Finnish locale additions are correct.

The new translation keys are properly added with appropriate Finnish translations that align with the feature requirements.

Also applies to: 279-279, 300-300

packages/visual-editor/locales/sv/visual-editor.json (1)

32-34: LGTM! Swedish locale additions are correct.

The new translation keys are properly added with appropriate Swedish translations following the expected pattern.

Also applies to: 280-280, 301-301

packages/visual-editor/locales/pl/visual-editor.json (1)

32-34: LGTM! Polish locale additions are correct.

The new translation keys are properly added with appropriate Polish translations that align with the feature implementation.

Also applies to: 280-280, 301-301

packages/visual-editor/locales/lv/visual-editor.json (1)

32-34: LGTM! Translation keys added correctly.

The new translation keys for aria.opensInNewTab, fields.linksPosition, and fields.openInNewTab are properly structured and support the new feature for opening links in new tabs with accessibility labels.

Also applies to: 279-279, 300-300

packages/visual-editor/src/components/header/ExpandedHeader.test.tsx (1)

943-1125: LGTM! Comprehensive test coverage for the new feature.

The new test case "version 50 props - with external links" effectively validates the openInNewTab functionality:

  • Tests the feature in both primary and secondary header slots
  • Includes links with and without openInNewTab: true to verify both states
  • Properly includes mobile menu interactions for complete coverage
  • Follows the established test pattern and structure
packages/visual-editor/locales/fr/visual-editor.json (1)

32-34: LGTM! French translations added correctly.

The new translation keys are properly structured and consistent with the additions in other locale files. The French translations appropriately support the new openInNewTab functionality and link positioning features.

Also applies to: 278-279, 299-300

packages/visual-editor/locales/de/visual-editor.json (1)

32-34: LGTM! German translations added correctly.

The new translation keys are properly structured and consistent with other locale files. The German translations "öffnet sich in einem neuen Tab" (opens in a new tab), "Linkposition" (link position), and "In neuem Tab öffnen" (open in new tab) appropriately support the new features.

Also applies to: 284-285, 305-306

packages/visual-editor/locales/cs/visual-editor.json (1)

32-34: LGTM! Czech translations added correctly.

The new translation keys are properly structured and complete the localization coverage. The Czech translations "otevře se na nové kartě" (opens in a new tab), "Pozice odkazů" (link position), and "Otevřít na nové kartě" (open in new tab) are consistent with the additions across all locale files.

Also applies to: 286-287, 307-308

packages/visual-editor/src/types/types.ts (1)

13-13: LGTM! Clean type extension.

The optional openInNewTab field properly extends the TranslatableCTA type to support the new functionality for opening links in a new tab.

packages/visual-editor/src/docs/components.md (1)

257-260: LGTM! Documentation correctly reflects the property rename and new center alignment option.

The documentation updates properly capture:

  • Property rename from linksAlignment to linksPosition
  • Extension of allowed values to include "center"

This aligns with the migration logic and PR objectives.

Also applies to: 749-751

packages/visual-editor/locales/da/visual-editor.json (2)

32-34: LGTM! New translations added correctly.

The additions properly support the new features:

  • aria.opensInNewTab for accessibility announcements
  • fields.linksPosition for the renamed property
  • fields.openInNewTab for the new field

Also applies to: 286-286, 307-307


285-286: Both linksAlignment and linksPosition are consistently present together across all 24 locale files. This appears to be an intentional pattern, not an inconsistency requiring resolution. No cleanup or backward compatibility decision is needed at this time.

packages/visual-editor/src/components/footer/ExpandedFooter.test.tsx (2)

33-38: LGTM! Test data properly exercises the new openInNewTab feature.

The testExternalFooterLinks constant includes a mix of links with and without openInNewTab: true, which will help verify the rendering of external link indicators.


1325-1676: LGTM! Comprehensive test coverage for version 50 changes.

The new test cases properly verify:

  • Usage of linksPosition (renamed from linksAlignment)
  • New "center" alignment option for secondary footer
  • External link rendering with openInNewTab flag
  • Both light and dark background variants

The tests include accessibility checks via axe() which will validate the ARIA labels for links opening in new tabs.

packages/visual-editor/src/components/migrations/migrationRegistry.ts (1)

51-51: LGTM! Migration properly registered.

The updateLinksAlignmentMigration is correctly imported and appended to the registry, which will ensure existing component instances are migrated from linksAlignment to linksPosition with proper fallback defaults.

Based on learnings, the migration index (50) is intentional and maintains the migration sequence.

Also applies to: 108-108

packages/visual-editor/src/docs/ai/components.d.ts (1)

551-551: LGTM! Type definitions correctly reflect the new features.

The type definitions accurately capture both the renamed linksPosition property with the new "center" option and the new optional openInNewTab boolean on TranslatableCTA.

Also applies to: 898-898

packages/visual-editor/src/components/footer/FooterExpandedLinksWrapper.tsx (1)

77-77: Verify that defaultLink includes an openInNewTab default value.

The implementation correctly passes openInNewTab to CTA and defines the schema field. However, like FooterExpandedLinkSectionSlot.tsx, verify that the imported defaultLink includes a default value for openInNewTab (compare with HeaderLinks.tsx which explicitly sets openInNewTab: false).

The verification script in the previous file review will also check this, as both components import the same defaultLink from ExpandedFooter.tsx.

Also applies to: 137-149

packages/visual-editor/src/components/header/HeaderLinks.tsx (1)

36-36: LGTM! Complete and correct implementation.

The implementation correctly:

  • Sets an explicit default value (openInNewTab: false) in defaultLink
  • Defines the schema field with appropriate Yes/No radio options
  • Passes the prop to the CTA component
  • Uses TypeScript's satisfies operator for type safety

This serves as the reference pattern for the footer components.

Also applies to: 58-67, 104-104

packages/visual-editor/src/components/migrations/0050_update_link_align_prop.ts (1)

3-46: Migration defaults are correct and implementation is sound.

The migration properly handles the property rename from linksAlignment to linksPosition with defaults verified against component implementations:

  • ExpandedFooter defaults to "right" ✓ (matches component default)
  • SecondaryFooterSlot defaults to "left" ✓ (matches component default)

The implementation correctly uses guard clauses, preserves all properties via spread operators, and implements the proper fallback chain: linksPosition ?? linksAlignment ?? default.

packages/visual-editor/src/components/footer/FooterLinksSlot.tsx (1)

45-59: LGTM! Clean switch-based alignment logic.

The switch statement properly handles all three alignment options (left, center, right) with appropriate Tailwind justify classes for the secondary variant.

packages/visual-editor/src/components/atoms/cta.tsx (3)

302-304: LGTM! Proper security attributes for new tab links.

The implementation correctly applies target="_blank" and rel="noopener noreferrer" when opening in a new tab, preventing potential security vulnerabilities (tabnabbing).


308-313: LGTM! Accessible external link indicator.

The external link icon is properly hidden from screen readers with aria-hidden="true" since the ARIA label already conveys the "opens in a new tab" information. The inline styling keeps the icon aligned with the text.


299-299: Verify that the className change doesn't break existing layouts.

The Link's className changed to "inline leading-none". This introduces a CSS conflict: the parent Button applies flex centering classes (flex items-center justify-center), while inline display on the Link prevents it from respecting flex layout. Additionally, leading-none removes line-height entirely, which could affect vertical alignment of the icon and text content.

With 25+ CTA component usages across the codebase, this change warrants visual regression testing to ensure no unintended layout breakage. Consider testing:

  • Vertical alignment of text and icon within each CTA variant
  • Line-height/spacing in primary, secondary, and link button variants
  • Behavior across different content lengths and icon combinations
packages/visual-editor/src/components/footer/ExpandedFooter.tsx (1)

135-154: LGTM! Consistent property rename from linksAlignment to linksPosition.

The rename is applied consistently across:

  • Type definition (Line 60)
  • Field schema (Lines 135-154)
  • Data destructuring (Line 195)
  • Default props (Lines 414, 445)

The migration file mentioned in the AI summary (0050_update_link_align_prop.ts) should handle backward compatibility for existing component instances.

Also applies to: 195-195, 414-414, 445-445

packages/visual-editor/src/components/footer/SecondaryFooterSlot.tsx (1)

47-47: LGTM! Property rename and center alignment support implemented correctly.

The changes consistently rename linksAlignment to linksPosition and add center alignment support:

  • Type definition extended to "left" | "center" | "right" (Line 47)
  • Field schema includes all three options with proper i18n labels (Lines 84-106)
  • Default value set to "left" (Line 183)
  • resolveData correctly reads linksPosition and propagates it as alignment to child slots (Line 233)

The migration (0050_update_link_align_prop.ts) should handle backward compatibility.

Also applies to: 84-106, 183-183, 233-233

@rkeerthient
Copy link
Contributor Author

rkeerthient commented Jan 2, 2026

Not sure why there are over 300+ files changed again. Could this possibly be because of the migration?

@github-actions
Copy link
Contributor

github-actions bot commented Jan 5, 2026

⚠️ Deleted Translation Keys Detected

🔤 Deleted Translation Keys

fields

Key Languages Removed
fields.linksAlignment cs,da de,en en-GB,es et,fi fr,hr hu,it ja,lt lv,nb nl,pl pt,ro sk,sv tr,zh zh-TW

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Fix all issues with AI Agents 🤖
In @packages/visual-editor/locales/en-GB/visual-editor.json:
- Line 277: The default layout seed in the defaultLayoutData export still uses
the old field name linksAlignment instead of the migrated linksPosition, causing
ExpandedFooter to receive the wrong prop; update the four occurrences of
linksAlignment in the defaultLayoutData constants (the objects that define
footer/layout seed data) to be linksPosition so the plugin uses the migrated
field name consistently.
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8f2cc01 and cd1627f.

⛔ Files ignored due to path filters (30)
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] default props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 10 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 19 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 20 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 42 props - basic.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 42 props - expanded with all data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
📒 Files selected for processing (26)
  • packages/visual-editor/locales/cs/visual-editor.json
  • packages/visual-editor/locales/da/visual-editor.json
  • packages/visual-editor/locales/de/visual-editor.json
  • packages/visual-editor/locales/en-GB/visual-editor.json
  • packages/visual-editor/locales/en/visual-editor.json
  • packages/visual-editor/locales/es/visual-editor.json
  • packages/visual-editor/locales/et/visual-editor.json
  • packages/visual-editor/locales/fi/visual-editor.json
  • packages/visual-editor/locales/fr/visual-editor.json
  • packages/visual-editor/locales/hr/visual-editor.json
  • packages/visual-editor/locales/hu/visual-editor.json
  • packages/visual-editor/locales/it/visual-editor.json
  • packages/visual-editor/locales/ja/visual-editor.json
  • packages/visual-editor/locales/lt/visual-editor.json
  • packages/visual-editor/locales/lv/visual-editor.json
  • packages/visual-editor/locales/nb/visual-editor.json
  • packages/visual-editor/locales/nl/visual-editor.json
  • packages/visual-editor/locales/pl/visual-editor.json
  • packages/visual-editor/locales/pt/visual-editor.json
  • packages/visual-editor/locales/ro/visual-editor.json
  • packages/visual-editor/locales/sk/visual-editor.json
  • packages/visual-editor/locales/sv/visual-editor.json
  • packages/visual-editor/locales/tr/visual-editor.json
  • packages/visual-editor/locales/zh-TW/visual-editor.json
  • packages/visual-editor/locales/zh/visual-editor.json
  • packages/visual-editor/src/components/atoms/cta.tsx
🚧 Files skipped from review as they are similar to previous changes (18)
  • packages/visual-editor/locales/tr/visual-editor.json
  • packages/visual-editor/locales/ro/visual-editor.json
  • packages/visual-editor/locales/hr/visual-editor.json
  • packages/visual-editor/locales/hu/visual-editor.json
  • packages/visual-editor/locales/cs/visual-editor.json
  • packages/visual-editor/locales/ja/visual-editor.json
  • packages/visual-editor/locales/pt/visual-editor.json
  • packages/visual-editor/locales/zh-TW/visual-editor.json
  • packages/visual-editor/locales/nb/visual-editor.json
  • packages/visual-editor/locales/lt/visual-editor.json
  • packages/visual-editor/locales/zh/visual-editor.json
  • packages/visual-editor/locales/fi/visual-editor.json
  • packages/visual-editor/locales/it/visual-editor.json
  • packages/visual-editor/src/components/atoms/cta.tsx
  • packages/visual-editor/locales/de/visual-editor.json
  • packages/visual-editor/locales/da/visual-editor.json
  • packages/visual-editor/locales/nl/visual-editor.json
  • packages/visual-editor/locales/sk/visual-editor.json
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-12-15T20:59:25.571Z
Learnt from: benlife5
Repo: yext/visual-editor PR: 943
File: packages/visual-editor/src/components/contentBlocks/image/Image.tsx:175-191
Timestamp: 2025-12-15T20:59:25.571Z
Learning: In the ImageWrapper component at packages/visual-editor/src/components/contentBlocks/image/Image.tsx, when an Image is wrapped in a MaybeLink, the aria-label should be omitted because the image's alt text serves as the accessible name for the link. Adding an aria-label would override the image's alt text.

Applied to files:

  • packages/visual-editor/locales/en/visual-editor.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: call_unit_test / unit_tests (22.x)
  • GitHub Check: call_unit_test / unit_tests (20.x)
  • GitHub Check: call_unit_test / unit_tests (24.x)
  • GitHub Check: semgrep/ci
🔇 Additional comments (19)
packages/visual-editor/locales/es/visual-editor.json (1)

32-34: LGTM! Spanish translations are accurate and well-structured.

The locale updates correctly support the new openInNewTab feature and the linksAlignmentlinksPosition refactoring. The translations are idiomatic Spanish, the JSON structure is valid, and the interpolation syntax for {{label}} is properly preserved.

Also applies to: 277-277, 298-298

packages/visual-editor/locales/lv/visual-editor.json (1)

32-34: LGTM! Locale changes align with the new feature.

The additions and rename follow the consistent pattern described in the PR:

  • The new aria.opensInNewTab key with template placeholder enhances accessibility for links opening in new tabs.
  • Renaming linksAlignment to linksPosition supports the expanded alignment options.
  • The new openInNewTab field provides the necessary translation for the feature.

All changes are structurally sound and consistent with locale conventions.

Also applies to: 278-278, 299-299

packages/visual-editor/locales/fr/visual-editor.json (3)

32-34: LGTM! Accessibility enhancement for new tab links.

The new ARIA translation key properly supports the openInNewTab feature by providing an accessible label for screen readers. The interpolation syntax is correct.


277-277: LGTM! Property rename coordinated with migration.

The rename from linksAlignment to linksPosition aligns with the expanded alignment options (left/center/right) mentioned in the PR. A migration handles existing data.


298-298: LGTM! Field label for new tab option.

The new openInNewTab field label provides proper localization for the UI control that allows users to configure links to open in new tabs.

packages/visual-editor/locales/sv/visual-editor.json (3)

32-34: LGTM! Accessibility translation added correctly.

The new ARIA namespace and opensInNewTab translation follow i18n best practices for accessibility. The Swedish translation is accurate and the interpolation pattern is consistent with the rest of the file.


279-279: LGTM! Field key renamed as part of migration.

The rename from linksAlignment to linksPosition aligns with the PR objectives and migration changes. The Swedish translation is accurate.


300-300: LGTM! New field translation added correctly.

The openInNewTab translation is accurate and supports the new feature functionality described in the PR objectives.

packages/visual-editor/locales/et/visual-editor.json (3)

32-34: LGTM! Proper ARIA label structure for accessibility.

The new aria.opensInNewTab translation correctly uses i18n interpolation and provides the accessibility label for links that open in new tabs. The JSON structure and interpolation syntax are correct.


278-278: LGTM! Field rename aligns with expanded functionality.

The rename from linksAlignment to linksPosition reflects the expanded options (left/center/right instead of just left/right) mentioned in the AI summary. The migration in the codebase handles the data transformation.


299-299: LGTM! New field supports the openInNewTab feature.

The new openInNewTab field translation is appropriate for the feature described in the PR objectives, allowing users to configure links to open in new tabs.

packages/visual-editor/locales/pl/visual-editor.json (3)

32-34: LGTM: Correct aria label for accessibility.

The Polish translation for the "opens in new tab" aria label is grammatically correct and follows proper accessibility patterns.


279-279: LGTM: Property rename correctly localized.

The translation accurately reflects the rename from linksAlignment to linksPosition, and the Polish text is appropriate for this UI label.


300-300: LGTM: Accurate translation for new field.

The Polish translation for "Open in new tab" is grammatically correct and uses the appropriate imperative form for a UI action label.

packages/visual-editor/locales/en/visual-editor.json (3)

32-34: LGTM! Excellent accessibility addition.

The new ARIA label pattern follows WCAG best practices for informing screen reader users when links open in new tabs. The i18n interpolation structure is correct and will properly compose accessible labels.


298-298: LGTM! Clear and concise field label.

The openInNewTab field label is straightforward and appropriately positioned.


277-277: Rename from linksAlignment to linksPosition is consistent across all locales.

Verified that all 25 locale files have been updated with the new key and no orphaned references to linksAlignment remain in the codebase.

packages/visual-editor/locales/en-GB/visual-editor.json (2)

32-34: Excellent accessibility addition!

The new ARIA label for links opening in new tabs follows accessibility best practices and will improve the experience for screen reader users.


298-298: LGTM!

The new field label is clear, concise, and follows standard UI conventions. The text is grammatically correct for British English.

benlife5
benlife5 previously approved these changes Jan 5, 2026
@benlife5
Copy link
Contributor

benlife5 commented Jan 5, 2026

Sorry, merge conflict

@rkeerthient rkeerthient dismissed stale reviews from mkilpatrick and benlife5 via 415d4f0 January 5, 2026 21:04
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
packages/visual-editor/locales/pt/visual-editor.json (1)

32-34: Terminology inconsistency: "guia" vs "aba" for "tab".

Line 33 uses "guia" while line 298 uses "aba" to translate "tab". Both are valid Portuguese terms, but mixing them creates inconsistency. As noted in the previous review, "aba" is more commonly used in UI contexts for browser tabs.

🔎 Suggested fix to standardize terminology
   "aria": {
-    "opensInNewTab": "{{label}} (abre em uma nova guia)"
+    "opensInNewTab": "{{label}} (abre em uma nova aba)"
   },
packages/visual-editor/locales/zh-TW/visual-editor.json (1)

32-34: LGTM! Locale changes are structurally correct.

The additions of aria.opensInNewTab, the rename from linksAlignment to linksPosition, and the new openInNewTab field properly mirror the changes in other locale files.

Note: The terminology inconsistency between "標籤頁" (line 33) and "選項卡" (line 298) for "tab" has already been flagged in previous review comments.

Also applies to: 278-278, 298-298

🧹 Nitpick comments (1)
packages/visual-editor/locales/pl/visual-editor.json (1)

299-299: LGTM! Field option added for new functionality.

The openInNewTab translation key supports the new prop added to TranslatableCTA. The placement under fields.name is appropriate and consistent with the structure in other locale files.

If not already done, consider having a native Polish speaker verify the translation accuracy for "Otwórz w nowej karcie" and the aria label at line 33.

📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cd1627f and 415d4f0.

⛔ Files ignored due to path filters (20)
  • packages/visual-editor/src/components/testing/screenshots/EventSection/[desktop] default props with document data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/EventSection/[desktop] default props with empty document.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/EventSection/[desktop] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/EventSection/[mobile] default props with document data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/EventSection/[mobile] default props with empty document.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/EventSection/[mobile] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/EventSection/[tablet] default props with document data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/EventSection/[tablet] version 48 props.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 10 props - expanded.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[desktop] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[mobile] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 50 - with external links, centered secondary links - Dark BG.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedFooter/[tablet] version 50 - with external links, centered secondary links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[desktop] version 50 props - with external links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[mobile] version 50 props - with external links (after interactions).png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/ExpandedHeader/[tablet] version 50 props - with external links.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/HeroSection/[desktop] default props with data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
  • packages/visual-editor/src/components/testing/screenshots/HeroSection/[desktop] default props with no data.png is excluded by !**/*.png, !packages/visual-editor/src/components/testing/screenshots/**
📒 Files selected for processing (28)
  • packages/visual-editor/locales/cs/visual-editor.json
  • packages/visual-editor/locales/da/visual-editor.json
  • packages/visual-editor/locales/de/visual-editor.json
  • packages/visual-editor/locales/en-GB/visual-editor.json
  • packages/visual-editor/locales/en/visual-editor.json
  • packages/visual-editor/locales/es/visual-editor.json
  • packages/visual-editor/locales/et/visual-editor.json
  • packages/visual-editor/locales/fi/visual-editor.json
  • packages/visual-editor/locales/fr/visual-editor.json
  • packages/visual-editor/locales/hr/visual-editor.json
  • packages/visual-editor/locales/hu/visual-editor.json
  • packages/visual-editor/locales/it/visual-editor.json
  • packages/visual-editor/locales/ja/visual-editor.json
  • packages/visual-editor/locales/lt/visual-editor.json
  • packages/visual-editor/locales/lv/visual-editor.json
  • packages/visual-editor/locales/nb/visual-editor.json
  • packages/visual-editor/locales/nl/visual-editor.json
  • packages/visual-editor/locales/pl/visual-editor.json
  • packages/visual-editor/locales/pt/visual-editor.json
  • packages/visual-editor/locales/ro/visual-editor.json
  • packages/visual-editor/locales/sk/visual-editor.json
  • packages/visual-editor/locales/sv/visual-editor.json
  • packages/visual-editor/locales/tr/visual-editor.json
  • packages/visual-editor/locales/zh-TW/visual-editor.json
  • packages/visual-editor/locales/zh/visual-editor.json
  • packages/visual-editor/src/components/atoms/cta.tsx
  • packages/visual-editor/src/components/header/ExpandedHeader.test.tsx
  • packages/visual-editor/src/components/migrations/migrationRegistry.ts
🚧 Files skipped from review as they are similar to previous changes (18)
  • packages/visual-editor/locales/sk/visual-editor.json
  • packages/visual-editor/locales/es/visual-editor.json
  • packages/visual-editor/locales/et/visual-editor.json
  • packages/visual-editor/locales/tr/visual-editor.json
  • packages/visual-editor/locales/zh/visual-editor.json
  • packages/visual-editor/locales/ja/visual-editor.json
  • packages/visual-editor/locales/ro/visual-editor.json
  • packages/visual-editor/locales/nb/visual-editor.json
  • packages/visual-editor/locales/lt/visual-editor.json
  • packages/visual-editor/locales/fi/visual-editor.json
  • packages/visual-editor/locales/fr/visual-editor.json
  • packages/visual-editor/locales/de/visual-editor.json
  • packages/visual-editor/locales/hr/visual-editor.json
  • packages/visual-editor/locales/hu/visual-editor.json
  • packages/visual-editor/locales/lv/visual-editor.json
  • packages/visual-editor/locales/it/visual-editor.json
  • packages/visual-editor/src/components/header/ExpandedHeader.test.tsx
  • packages/visual-editor/src/components/atoms/cta.tsx
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-12-12T20:17:37.033Z
Learnt from: benlife5
Repo: yext/visual-editor PR: 946
File: packages/visual-editor/src/components/migrations/migrationRegistry.ts:47-48
Timestamp: 2025-12-12T20:17:37.033Z
Learning: In the yext/visual-editor repository, empty object placeholders (`{}`) in the migrationRegistry array are sometimes intentionally used to reserve migration slots for parallel PRs to prevent merge conflicts and maintain consistent migration indices.

Applied to files:

  • packages/visual-editor/src/components/migrations/migrationRegistry.ts
  • packages/visual-editor/locales/en-GB/visual-editor.json
📚 Learning: 2025-12-15T20:59:25.571Z
Learnt from: benlife5
Repo: yext/visual-editor PR: 943
File: packages/visual-editor/src/components/contentBlocks/image/Image.tsx:175-191
Timestamp: 2025-12-15T20:59:25.571Z
Learning: In the ImageWrapper component at packages/visual-editor/src/components/contentBlocks/image/Image.tsx, when an Image is wrapped in a MaybeLink, the aria-label should be omitted because the image's alt text serves as the accessible name for the link. Adding an aria-label would override the image's alt text.

Applied to files:

  • packages/visual-editor/locales/en/visual-editor.json
📚 Learning: 2025-12-12T19:26:15.855Z
Learnt from: benlife5
Repo: yext/visual-editor PR: 942
File: packages/visual-editor/src/utils/schema/schemaBlocks.ts:29-35
Timestamp: 2025-12-12T19:26:15.855Z
Learning: In packages/visual-editor/src/utils/schema/schemaBlocks.ts, when siteDomain is missing (non-live/preview environments), schema id fields should use relative URLs rather than bare fragments, since Google will only crawl production sites where siteDomain is populated.

Applied to files:

  • packages/visual-editor/locales/en-GB/visual-editor.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: call_unit_test / unit_tests (20.x)
  • GitHub Check: call_unit_test / unit_tests (24.x)
  • GitHub Check: call_unit_test / unit_tests (22.x)
  • GitHub Check: semgrep/ci
🔇 Additional comments (13)
packages/visual-editor/locales/pt/visual-editor.json (2)

278-278: LGTM!

The translation "Posição dos links" (Position of links) is accurate and appropriate for the renamed field.


298-298: LGTM!

The translation "Abrir em nova aba" is accurate and grammatically correct. This uses "aba" for tab, which is the preferred term for UI contexts.

packages/visual-editor/locales/pl/visual-editor.json (2)

32-34: LGTM! Proper accessibility label added.

The new aria.opensInNewTab key correctly provides an accessible label for links that open in a new tab, using proper interpolation syntax for the label placeholder.


279-279: Locale file change is correct; however, test data and variable naming need attention.

The rename from linksAlignment to linksPosition in the locale file is accurate. The migration file 0050_update_link_align_prop.ts correctly handles the transformation by reading the old key and converting it to the new one with appropriate fallback defaults.

However, test files (ExpandedFooter.test.tsx) still reference the old linksAlignment key throughout their test data. While this may be intentional for testing the migration logic, verify that tests properly exercise the migration path. Additionally, ExpandedFooter.tsx line 195 destructures linksPosition but aliases it as primaryLinksAlignment, which creates misleading naming and should be clarified.

packages/visual-editor/locales/da/visual-editor.json (3)

32-34: LGTM! New ARIA translation key added.

The new aria.opensInNewTab translation correctly supports the accessibility requirement for links that open in new tabs, using proper interpolation syntax for the dynamic label.


285-285: LGTM! Property rename from linksAlignment to linksPosition.

The translation key has been properly updated to reflect the prop rename, which aligns with the migration that moves existing linksAlignment values to linksPosition.


305-305: LGTM! New field label for openInNewTab feature.

The translation correctly labels the new openInNewTab field that's being added to CTA components per the PR objectives.

packages/visual-editor/locales/cs/visual-editor.json (1)

32-34: LGTM! Localization updates consistent with feature additions.

The Czech locale correctly adds:

  • aria.opensInNewTab for accessibility
  • Renamed linksAlignmentlinksPosition
  • New openInNewTab field label

These changes align with the PR objectives and match the pattern across other locale files.

Note: The past review comment asking about linksAlignment usage is resolved by this PR, which migrates the old property to the new linksPosition name via the migration at 0050_update_link_align_prop.ts.

Also applies to: 285-285, 305-305

packages/visual-editor/locales/nl/visual-editor.json (1)

32-34: LGTM! Dutch locale properly updated.

All three required translation changes are present:

  • aria.opensInNewTab: "{{label}} (wordt geopend in een nieuw tabblad)"
  • fields.linksPosition: "Links Positie"
  • fields.openInNewTab: "Openen in nieuw tabblad"

The translations are properly structured and consistent with the feature requirements.

Also applies to: 278-278, 298-298

packages/visual-editor/locales/sv/visual-editor.json (1)

32-34: LGTM! Swedish locale updates complete.

The Swedish translations properly support the new features:

  • aria.opensInNewTab: "{{label}} (öppnas i en ny flik)"
  • fields.linksPosition: "Länkar Position"
  • fields.openInNewTab: "Öppna i ny flik"

All localization changes across the reviewed files (da, cs, nl, sv) follow a consistent pattern and correctly implement the i18n requirements for the openInNewTab feature and linksPosition rename.

Also applies to: 279-279, 299-299

packages/visual-editor/src/components/migrations/migrationRegistry.ts (1)

52-52: Critical: Duplicate migration number prefix detected.

Both promoVariants (line 51) and updateLinksAlignmentMigration (line 52) use the "0050" prefix in their filenames:

  • ./0050_promo_variants.ts
  • ./0050_update_link_align_prop.ts

Migration files should have unique sequential numbers. The file 0050_update_link_align_prop.ts should be renamed to 0051_update_link_align_prop.ts (or the next available number) to maintain the numbering convention and prevent confusion during debugging or future maintenance.

🔎 Recommended fix
  1. Rename the migration file:

    0050_update_link_align_prop.ts → 0051_update_link_align_prop.ts
    
  2. Update the import on line 52:

    -import { updateLinksAlignmentMigration } from "./0050_update_link_align_prop.ts";
    +import { updateLinksAlignmentMigration } from "./0051_update_link_align_prop.ts";

Also applies to: 110-110

⛔ Skipped due to learnings
Learnt from: benlife5
Repo: yext/visual-editor PR: 946
File: packages/visual-editor/src/components/migrations/migrationRegistry.ts:47-48
Timestamp: 2025-12-12T20:17:37.033Z
Learning: In the yext/visual-editor repository, empty object placeholders (`{}`) in the migrationRegistry array are sometimes intentionally used to reserve migration slots for parallel PRs to prevent merge conflicts and maintain consistent migration indices.
packages/visual-editor/locales/en-GB/visual-editor.json (1)

32-34: LGTM! Locale changes support the new feature.

The additions of aria.opensInNewTab, the rename from linksAlignment to linksPosition, and the new openInNewTab field are all consistent with the PR objectives and properly structured.

Also applies to: 277-277, 297-297

packages/visual-editor/locales/en/visual-editor.json (1)

32-34: LGTM! Locale changes support the new feature.

The additions of aria.opensInNewTab, the rename from linksAlignment to linksPosition, and the new openInNewTab field are all consistent with the PR objectives and properly structured.

Also applies to: 277-277, 297-297

benlife5
benlife5 previously approved these changes Jan 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants